<?php
// $Id: MultisiteMailer.php 2522 2008-11-27 12:59:28Z phppp $
//  ------------------------------------------------------------------------ //
//                XOOPS - PHP Content Management System                      //
//                    Copyright (c) 2000 XOOPS.org                           //
//                       <http://www.xoops.org/>                             //
//  ------------------------------------------------------------------------ //
//  This program is free software; you can redistribute it and/or modify     //
//  it under the terms of the GNU General Public License as published by     //
//  the Free Software Foundation; either version 2 of the License, or        //
//  (at your option) any later version.                                      //
//                                                                           //
//  You may not change or alter any portion of this comment or credits       //
//  of supporting developers from this source code or any supporting         //
//  source code which is considered copyrighted (c) material of the          //
//  original comment or credit authors.                                      //
//                                                                           //
//  This program is distributed in the hope that it will be useful,          //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of           //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            //
//  GNU General Public License for more details.                             //
//                                                                           //
//  You should have received a copy of the GNU General Public License        //
//  along with this program; if not, write to the Free Software              //
//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA //
//  ------------------------------------------------------------------------ //
// Author: Kazumi Ono (AKA onokazu)                                          //
// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
// Project: The XOOPS Project                                                //
// ------------------------------------------------------------------------- //
if (!defined("XOOPS_ROOT_PATH")) {
    die("XOOPS root path not defined");
}
if (isset($GLOBALS['xoopsConfig']['language']) && file_exists(XOOPS_ROOT_PATH.'/language/'.$GLOBALS['xoopsConfig']['language'].'/mail.php')) {
    include_once XOOPS_ROOT_PATH . '/language/' . $GLOBALS['xoopsConfig']['language'] . '/mail.php';
} else {
    include_once XOOPS_ROOT_PATH . '/language/english/mail.php';
}

/**
 * The new Multimailer class that will carry out the actual sending and will later replace this class.
 * If you're writing new code, please use that class instead.
 */
include_once XOOPS_ROOT_PATH."/modules/multisite/class/multimailer.php";


/**
 * Class for sending mail.
 *
 * Changed to use the facilities of  {@link XoopsMultiMailer}
 *
 * @deprecated    use {@link XoopsMultiMailer} instead.
 *
 * @package        class
 * @subpackage    mail
 *
 * @author        Kazumi Ono    <onokazu@xoops.org>
 * @copyright    (c) 2000-2003 The Xoops Project - www.xoops.org
 */
class MultisiteMailer
{
    /**
     * reference to a {@link XoopsMultiMailer}
     *
     * @var        XoopsMultiMailer
     * @access    private
     * @since    21.02.2003 14:14:13
     */
    var $multimailer;

    // sender email address
    // private
    var $fromEmail;

    // sender name
    // private
    var $fromName;

    // RMV-NOTIFY
    // sender UID
    // private
    var $fromUser;

    // array of user class objects
    // private
    var $toUsers;

    // array of email addresses
    // private
    var $toEmails;

    // custom headers
    // private
    var $headers;

    // subjet of mail
    // private
    var $subject;

    // body of mail
    // private
    var $body;

    // error messages
    // private
    var $errors;

    // messages upon success
    // private
    var $success;

    // private
    var $isMail;

    // private
    var $isPM;

    // private
    var $assignedTags;

    // private
    var $template;

    // private
    var $templatedir;

    // protected
    var $charSet = 'iso-8859-1';

    // protected
    var $encoding = '8bit';

    function MultisiteMailer()
    {
        $this->multimailer = new MultisiteMultiMailer();
        $this->reset();
    }

    // public
    // reset all properties to default
    function reset()
    {
        $this->fromEmail = "";
        $this->fromName = "";
        $this->fromUser = null; // RMV-NOTIFY
        $this->priority = '';
        $this->toUsers = array();
        $this->toEmails = array();
        $this->headers = array();
        $this->subject = "";
        $this->body = "";
        $this->errors = array();
        $this->success = array();
        $this->isMail = false;
        $this->isPM = false;
        $this->assignedTags = array();
        $this->template = "";
        $this->templatedir = "";
        // Change below to \r\n if you have problem sending mail
        $this->LE ="\n";
    }

    // public
    function setTemplateDir($value = null)
    {
        if ($value === null && is_object($GLOBALS['xoopsModule'])) {
            $value = $GLOBALS['xoopsModule']->getVar('dirname', 'n');
        } else {
            $value = str_replace( DIRECTORY_SEPARATOR, "/", $value );
        }
        $this->templatedir = $value;
    }

    // private
    function getTemplatePath()
    {
        if (!$path = $this->templatedir) {
            $path = XOOPS_ROOT_PATH . "/language/";
        } elseif ( false === strpos($path, '/') ) {
            $path = XOOPS_ROOT_PATH . "/modules/" . $path . "/languages/";
        } elseif ( substr($path, -1, 1) != "/" ) {
            $path .= "/";
        }
        if (file_exists($path . $GLOBALS['xoopsConfig']['language'] . "/mail_template/" . $this->template) ) {
            return $path . $GLOBALS['xoopsConfig']['language'] . "/mail_template/" . $this->template;
        } elseif (file_exists($path . "english/mail_template/" . $this->template) ) {
            return $path . "english/mail_template/" . $this->template;
        } elseif (file_exists($path . $this->template) ) {
            return $path . $this->template;
        } else {
            return false;
        }
    }

    // public
    function setTemplate($value)
    {
        $this->template = $value;
    }

    // pupblic
    function setFromEmail($value)
    {
        $this->fromEmail = trim($value);
    }

    // public
    function setFromName($value)
    {
        $this->fromName = trim($value);
    }

    // RMV-NOTIFY
    // public
    function setFromUser(&$user)
    {
        if ( strtolower(get_class($user)) == "xoopsuser" ) {
            $this->fromUser =& $user;
        }
    }

    // public
    function setPriority($value)
    {
        $this->priority = trim($value);
    }


    // public
    function setSubject($value)
    {
        $this->subject = trim($value);
    }

    // public
    function setBody($value)
    {
        $this->body = trim($value);
    }

    // public
    function useMail()
    {
        $this->isMail = true;
    }

    // public
    function usePM()
    {
        $this->isPM = true;
    }

    // public
    function send($debug = false)
    {
        global $xoopsConfig;
        if ( $this->body == "" && $this->template == "" ) {
            if ($debug) {
                $this->errors[] = _MAIL_MSGBODY;
            }
            return false;
        } elseif ( $this->template != "" ) {
            $path = $this->getTemplatePath();
            if ( !($fd = @fopen($path, 'r')) ) {
                if ($debug) {
                    $this->errors[] = _MAIL_FAILOPTPL;
                }
                return false;
            }
            $this->setBody(fread($fd, filesize($path)));
        }

        // for sending mail only
        if ( $this->isMail  || !empty($this->toEmails) ) {
            if (!empty($this->priority)) {
                $this->headers[] = "X-Priority: " . $this->priority;
            }
            //$this->headers[] = "X-Mailer: PHP/".phpversion();
            //$this->headers[] = "Return-Path: ".$this->fromEmail;
            $headers = join($this->LE, $this->headers);
        }

// TODO: we should have an option of no-reply for private messages and emails
// to which we do not accept replies.  e.g. the site admin doesn't want a
// a lot of message from people trying to unsubscribe.  Just make sure to
// give good instructions in the message.

        // add some standard tags (user-dependent tags are included later)
        global $xoopsConfig;
        $this->assign ('X_ADMINMAIL', $xoopsConfig['adminmail']);
        $this->assign ('X_SITENAME', $xoopsConfig['sitename']);
        $this->assign ('X_SITEURL', XOOPS_URL . "/");
        // TODO: also X_ADMINNAME??
        // TODO: X_SIGNATURE, X_DISCLAIMER ?? - these are probably best
        //  done as includes if mail templates ever get this sophisticated

        // replace tags with actual values
        foreach ( $this->assignedTags as $k => $v ) {
            $this->body = str_replace("{".$k."}", $v, $this->body);
            $this->subject = str_replace("{".$k."}", $v, $this->subject);
        }
        $this->body = str_replace("\r\n", "\n", $this->body);
        $this->body = str_replace("\r", "\n", $this->body);
        $this->body = str_replace("\n", $this->LE, $this->body);

        // send mail to specified mail addresses, if any
        foreach ( $this->toEmails as $mailaddr ) {
            if ( !$this->sendMail($mailaddr, $this->subject, $this->body, $headers) ) {
                if ($debug) {
                    $this->errors[] = sprintf(_MAIL_SENDMAILNG, $mailaddr);
                }
            } else {
                if ($debug) {
                    $this->success[] = sprintf(_MAIL_MAILGOOD, $mailaddr);
                }
            }
        }

        // send message to specified users, if any

        // NOTE: we don't send to LIST of recipients, because the tags
        // below are dependent on the user identity; i.e. each user
        // receives (potentially) a different message

        foreach ( $this->toUsers as $user ) {
            // set some user specific variables
            $subject = str_replace("{X_UNAME}", $user->getVar("uname"), $this->subject );
            $text = str_replace("{X_UID}", $user->getVar("uid"), $this->body );
            $text = str_replace("{X_UEMAIL}", $user->getVar("email"), $text );
            $text = str_replace("{X_UNAME}", $user->getVar("uname"), $text );
            $text = str_replace("{X_UACTLINK}", XOOPS_URL."/register.php?op=actv&id=".$user->getVar("uid")."&actkey=".$user->getVar('actkey'), $text );
            // send mail
            if ( $this->isMail ) {
                if ( !$this->sendMail($user->getVar("email"), $subject, $text, $headers) ) {
                    if ($debug) {
                        $this->errors[] = sprintf(_MAIL_SENDMAILNG, $user->getVar("uname"));
                    }
                } else {
                    if ($debug) {
                        $this->success[] = sprintf(_MAIL_MAILGOOD, $user->getVar("uname"));
                    }
                }
            }
            // send private message
            if ( $this->isPM ) {
                if ( !$this->sendPM($user->getVar("uid"), $subject, $text) ) {
                    if ($debug) {
                        $this->errors[] = sprintf(_MAIL_SENDPMNG, $user->getVar("uname"));
                    }
                } else {
                    if ($debug) {
                        $this->success[] = sprintf(_MAIL_PMGOOD, $user->getVar("uname"));
                    }
                }
            }
            flush();
        }
        if ( count($this->errors) > 0 ) {
            return false;
        }
        return true;
    }

    // private
    function sendPM($uid, $subject, $body)
    {
        global $xoopsUser;
        $pm_handler =& xoops_gethandler('privmessage');
        $pm =& $pm_handler->create();
        $pm->setVar("subject", $subject);
        // RMV-NOTIFY
        $pm->setVar('from_userid', !empty($this->fromUser)
                                    ? $this->fromUser->getVar('uid')
                                    : ( empty($xoopsUser)
                                        ? 1
                                        : $xoopsUser->getVar('uid')
                                        )
                                    );
        $pm->setVar("msg_text", $body);
        $pm->setVar("to_userid", $uid);
        if (!$pm_handler->insert($pm)) {
            return false;
        }
        return true;
    }

    /**
     * Send email
     *
     * Uses the new XoopsMultiMailer
     *
     * @param    string
     * @param    string
     * @param    string
     * @return    boolean    FALSE on error.
     */

    function sendMail($email, $subject, $body, $headers)
    {
        $subject = $this->encodeSubject($subject);
        $this->encodeBody($body);
        $this->multimailer->ClearAllRecipients();
        $this->multimailer->AddAddress($email);
        $this->multimailer->Subject = $subject;
        $this->multimailer->Body = $body;
        $this->multimailer->CharSet = $this->charSet;
        $this->multimailer->Encoding = $this->encoding;
        if (!empty($this->fromName)) {
            $this->multimailer->FromName = $this->encodeFromName($this->fromName);
        }
        if (!empty($this->fromEmail)) {
            $this->multimailer->Sender = $this->multimailer->From = $this->fromEmail;
        }

        $this->multimailer->ClearCustomHeaders();
        foreach ($this->headers as $header) {
            $this->multimailer->AddCustomHeader($header);
        }
        if (!$this->multimailer->Send()) {
            $this->errors[] = $this->multimailer->ErrorInfo;
            return FALSE;
        }
        return TRUE;
    }

    // public
    function getErrors($ashtml = true)
    {
        if ( !$ashtml ) {
            return $this->errors;
        } else {
            if ( !empty($this->errors) ) {
                $ret = "<h4>"._ERRORS."</h4>";
                foreach ( $this->errors as $error ) {
                    $ret .= $error."<br />";
                }
            } else {
                $ret = "";
            }
            return $ret;
        }
    }

    // public
    function getSuccess($ashtml = true)
    {
        if ( !$ashtml ) {
            return $this->success;
        } else {
            $ret = "";
            if ( !empty($this->success) ) {
                foreach ( $this->success as $suc ) {
                    $ret .= $suc."<br />";
                }
            }
            return $ret;
        }
    }

    // public
    function assign($tag, $value=null)
    {
        if ( is_array($tag) ) {
            foreach ( $tag as $k => $v ) {
                $this->assign($k, $v);
            }
        } else {
            if ( !empty($tag) && isset($value) ) {
                $tag = strtoupper(trim($tag));
// RMV-NOTIFY
// TEMPORARY FIXME: until the X_tags are all in here
//                if ( substr($tag, 0, 2) != "X_" ) {
                    $this->assignedTags[$tag] = $value;
//                }
            }
        }
    }

    // public
    function addHeaders($value)
    {
        $this->headers[] = trim($value).$this->LE;
    }

    // public
    function setToEmails($email)
    {
        if ( !is_array($email) ) {
            if (preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i",$email) ) {
                array_push($this->toEmails, $email);
            }
        } else {
            foreach ( $email as $e) {
                $this->setToEmails($e);
            }
        }
    }

    // public
    function setToUsers(&$user)
    {
        if ( !is_array($user) ) {
            if ( strtolower(get_class($user)) == "xoopsuser" ) {
                array_push($this->toUsers, $user);
            }
        } else {
            foreach ( $user as $u) {
                $this->setToUsers($u);
            }
        }
    }

    // public
    function setToGroups($group)
    {
        if ( !is_array($group) ) {
            if ( strtolower(get_class($group)) == "xoopsgroup" ) {
                $member_handler =& xoops_gethandler('member');
                $this->setToUsers($member_handler->getUsersByGroup($group->getVar('groupid'), true));
            }
        } else {
            foreach ($group as $g) {
                $this->setToGroups($g);
            }
        }
    }

    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeFromName($text)
    {
        return $text;
    }

    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeSubject($text)
    {
        return $text;
    }

    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeBody(&$text)
    {

    }
}
?>